ホームに戻る
出典 :
UIElement.Visibility プロパティ (System.Windows) | Microsoft Learn Visibility Enum (System.Windows) | Microsoft Learn UIElement.IsVisible Property (System.Windows) | Microsoft Learn UIElement.IsVisibleChanged Event (System.Windows) | Microsoft Learn 【WPF XAML】自作UserControlのプロパティはバインドできない? #C# - Qiita
関連 :
コントロールの重ね描き データバインディング 依存関係プロパティ Taskの開始と終了待ち
目次 :

UIElement.Visibility プロパティ

UI要素の可視性を司るプロパティ。取得( get )および設定( set )が可能である。
Visibility 列挙体として宣言されており、以下の3つの値をとる。
画像

補足

Visibility は依存関係プロパティであるため、 データバインディングのターゲットとすることが可能である。
また、Visibility が変更されると、IsVisible プロパティが連動して変化する。
これは値の取得のみが可能で、Visibility == Visible 時は true 、それ以外は false となる。

注意が必要な点(データバインディング)

UIイベントハンドラ(ボタンクリックなど)内で Visibility に紐づくソース値を変更した場合、アプリケーションに処理が戻るまでは表示が更新されない。
(これは Visibility に限らず、ZIndex などの表示に関連する他のプロパティも同様である。)
画像
この場合、時間のかかる処理をハンドラ内で同期的に実行せず、非同期処理とすればよい。
( await でアプリケーションに処理を戻す。)
(データバインディングを用いず、プロパティを直接操作した場合も同様?要調査)
修正前のコード(抜粋)
/// <summary> /// ボタンクリック時の処理 /// </summary> private void Button_Click( object sender, RoutedEventArgs e ) => ClickHandler_Core(); /// <summary> /// ボタンクリック時の処理(主処理) /// </summary> private void ClickHandler_Core() { // Visibility を更新 ViewModel.LabelVisibility.Value = Visibility.Visible; // (この時点で表示が変わっていてほしい) // 時間がかかる処理 HeavyProc(); // (実際に表示が変化するのは HeavyProc() の完了後) }
修正後のコード(抜粋)
/// <summary> /// ボタンクリック時の処理 /// </summary> private void Button_Click( object sender, RoutedEventArgs e ) => ClickHandler_Core(); /// <summary> /// ボタンクリック時の処理(主処理) ⇒ 非同期( async )化 /// </summary> private async Task ClickHandler_Core() { // Visibility を更新 ViewModel.LabelVisibility.Value = Visibility.Visible; // 時間がかかる処理 ⇒ await で呼び元に処理を戻す await Task.Run( () => HeavyProc() ); // (HeavyProc() 開始直後に表示が変化する) }